package com.daxia.ogmall.dao;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;

import com.daxia.ogmall.common.Logs;
import com.daxia.ogmall.common.ProductCategoryStatus;
import com.daxia.ogmall.daobase.GenericDAOHibernate;
import com.daxia.ogmall.dto.ProductCategoryDTO;
import com.daxia.ogmall.model.ProductCategory;
import com.daxia.ogmall.support.Page;

@Repository
public class ProductCategoryDAO extends GenericDAOHibernate<ProductCategory> {

    public List<ProductCategory> find(ProductCategoryDTO dto, Page page) {
        StringBuilder hql = new StringBuilder();
        List<Object> paras = new ArrayList<Object>();
        hql.append("From ProductCategory n where 1 = 1 ");
        if (dto.getId() != null) {
            hql.append(" and n.id = ? ");
            paras.add(dto.getId());
        }
        if (StringUtils.isNotBlank(dto.getName())) {
            hql.append(" and n.name = ? ");
            paras.add(dto.getName());
        }					
        if (dto.getStatus() != null) {
            hql.append(" and n.status = ? ");
            paras.add(dto.getStatus());
        }
        if (StringUtils.isNotBlank(dto.getCode())) {
            hql.append(" and n.code = ? ");
            paras.add(dto.getCode());
        }		
        if (dto.getLevel() != null) {
            hql.append(" and n.level = ? ");
            paras.add(dto.getLevel());
        }
        if (dto.getParentCategory() != null) {
        	if (dto.getParentCategory().getId() != null) {
	            hql.append(" and n.parentCategory.id = ? ");
	            paras.add(dto.getParentCategory().getId());
        	}
        }	
        if (dto.getNames() != null) {
        	hql.append(" and n.name = ? and n.parentCategory.name = ? and n.parentCategory.parentCategory.name = ? ");
        	paras.add(dto.getNames()[2]);
        	paras.add(dto.getNames()[1]);
        	paras.add(dto.getNames()[0]);
        }
        Logs.COMMON.debug(hql);
        if (dto.isFindRoot()) {
        	hql.append(" and n.parentCategory is null ");
        }
        
        if (!dto.isFindAll()) {
        	hql.append(" and n.status != ? ");
        	paras.add(ProductCategoryStatus.Inactive.getValue());
        }
        return super.find(hql.toString(), paras.toArray(), page);
    }
    
    public ProductCategory findOne(ProductCategoryDTO dto) {
		Page page = new Page();
		page.setPageSize(1);
		page.setPage(1);
		
		List<ProductCategory> list = this.find(dto, page);
	    return CollectionUtils.isEmpty(list) ? null : list.get(0);
    }
}
